/////////////////////////////////////////////////////////////////////////////
/*/	
 *	Creator:		Joshua C. Rouzer
 *	Title:			Particle Manager cpp
 *	Last Edited:	07/16/2013
 *	Summary:		
/*/
/////////////////////////////////////////////////////////////////////////////
#include "ParticleManager.h"
#include "CSGD_TextureManager.h"
CParticleManager* CParticleManager::s_pInstance = nullptr;
/////////////////////////////////////////////////////////////////////////////
// Function		: Default Constructor
// Notes		: Assigns basic values to variables
/////////////////////////////////////////////////////////////////////////////
CParticleManager::CParticleManager(){}
/////////////////////////////////////////////////////////////////////////////
// Function		: Destructor
// Notes		: Cleans up any dynamically allocated memory
/////////////////////////////////////////////////////////////////////////////
CParticleManager::~CParticleManager(){
	Clear();
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Get Instance
// Return		: An instance of the particle manager
// Notes		: Creates or returns the instance of the particle manager
/////////////////////////////////////////////////////////////////////////////
CParticleManager* CParticleManager::GetInstance(){
	if( s_pInstance == nullptr )
		s_pInstance = new CParticleManager();
	return s_pInstance;
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Delete Instance
// Notes		: Removes the instance of the particle manager
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::DeleteInstance(){
	delete s_pInstance;
	s_pInstance = nullptr;
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Add Emitter
// Parameters	: pEmitter - The emitter to be added
// Notes		: Adds the provided emitter to the list of emitters
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::AddEmitter(CEmitter* pEmitter){
	bool nEmit = true;
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		if(*m_Emitters[iter] == *pEmitter){
			nEmit = false;
		}
	}
	if(nEmit){
		m_Emitters.push_back(pEmitter);
	}
	else{
		delete pEmitter;
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Clear
// Notes		: Removes all emitters and their particles
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::Clear(){
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		m_Emitters[iter]->Clear();
	}
	while(m_Emitters.size() > 0){
		delete m_Emitters[0];
		m_Emitters.erase(m_Emitters.begin());
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Remove Emitter
// Parameters	: pEmitter - The emitter to be removed
// Return		: Whether the provided emitter was removed or not
// Notes		: Removes the provided emitter from the list
/////////////////////////////////////////////////////////////////////////////
bool CParticleManager::RemoveEmitter(CEmitter* pEmitter){
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		if(*m_Emitters[iter] == *pEmitter){
			delete m_Emitters[iter];
			m_Emitters.erase(m_Emitters.begin() + iter);
			return true;
		}
	}
	return false;
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Render All
// Notes		: Goes through all emitters calling render functions
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::RenderAll(){
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		m_Emitters[iter]->RenderAll();
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Update All
// Parameters	: dT - Time elapsed since last update
// Notes		: Calls all emitter's update functions
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::UpdateAll(float dT){
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		m_Emitters[iter]->Update(dT, this);
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Stop All
// Notes		: Calls all emitter's stop functions
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::StopAll(){
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		m_Emitters[iter]->Stop();
	}
}
/////////////////////////////////////////////////////////////////////////////
// Function		: Start All
// Notes		: Calls all emitter's start functions
/////////////////////////////////////////////////////////////////////////////
void CParticleManager::StartAll(){
	for(unsigned int iter = 0; iter < m_Emitters.size(); iter++){
		m_Emitters[iter]->Start();
	}
}